package satk.database;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import satk.beans.interfaces.IntControlManagerDB;
import satk.objetos.Categoria;

/**
 * <h3>ManagerCategoria.java</h3>
 * <div><em>Fecha de creación: 8/05/2011, 04:32:36 PM.</em></div>
 * <p></p>
 * @author Sergio Flores Genis <sf.cancun@gmail.com>
 */
public class ManagerCategoria extends DBManager
        implements IntControlManagerDB<Categoria> {

    public ManagerCategoria(Connection c) {
        super(c);
    }

    public ManagerCategoria() {
        super();
    }

    @Override
    public Categoria getById(long id) {
        String query = "SELECT * FROM c_categoria WHERE (idc_categoria = ?);";
        Prepare parametros = new Prepare(1);
        parametros.add(id, Types.VARCHAR);
        Categoria categoria = null;
        try {
            ResultSet r = this.select(query, parametros);
            r.first();
            categoria = makeObject(r);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCategoria.class.getName()).log(Level.SEVERE,
                    "Error al buscar la categoria", ex);
        } finally {
            this.closeConexion();
        }
        return categoria;
    }

    public Categoria getByName(String name) {
        String query = "SELECT * FROM c_categoria WHERE (nomc_categoria = ?);";
        Prepare parametros = new Prepare(1);
        parametros.add(name, Types.VARCHAR);
        Categoria categoria = null;
        try {
            ResultSet r = this.select(query, parametros);
            r.first();
            categoria = makeObject(r);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCategoria.class.getName()).log(Level.SEVERE,
                    "Error al buscar la categoria", ex);
        } finally {
            this.closeConexion();
        }
        return categoria;
    }

    /**
     * Metodo para buscar categorias por su nombre
     * @param name Cadena con la que se buscaran coincidencias
     * @param limit Limite de de resultados (0 - sin limite)
     * @return Lista con las coincidencias encontradas
     */
    public List<Categoria> findCategoria(String name, int limit) {
        List<Categoria> list = new LinkedList<Categoria>();
        try {
            ResultSet r = find("c_categoria", "nomc_categoria", name, limit);
            while (r.next()) {
                Categoria c = makeObject(r);
                list.add(c);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCategoria.class.getName()).log(Level.SEVERE,
                    "Error al buscar las categorias", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerCategoria.class.getName()).log(Level.WARNING,
                    "Exepcion desconosida", ex);
        } finally {
            closeConexion();
        }
        return list;
    }

    @Override
    public int add(Categoria o) throws SQLException {
        String query = "INSERT INTO c_categoria (nomc_categoria, sigc_categoria) VALUES(?, ?);";
        Prepare parametros = new Prepare(2);
        parametros.add(o.getNombre(), Types.VARCHAR);
        parametros.add(o.getSiglas(), Types.VARCHAR);
        int result = this.edit(query, parametros);
        int identificador = this.getLastIdInsert();
        o.setIdentificador(identificador);
        this.closeConexion();
        return result;
    }

    private synchronized Categoria makeObject(ResultSet r) throws SQLException {
        int identificador = r.getInt("idc_categoria");
        String nombre = r.getString("nomc_categoria");
        String sigla = r.getString("sigc_categoria");
        return new Categoria(identificador, nombre, sigla);
    }

    @Override
    public List<Categoria> getAll() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int update(Categoria o, Categoria n) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int remove(Categoria o) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
